package composite.composemode;

import java.util.Iterator;
import java.util.Stack;

/**
 * @description: 重要方法 为了适配子菜单和菜单的重复嵌套问题 需要在这里解决两个问题
 * 1:如何正确打印菜单结构：用栈
 * 2:如何返回正确的迭代器类型：所有迭代器继承这个类
　* @author 周杨
　* @date 2019/5/29  17:19
**/
public class ComposeIterator implements Iterator {
    private Stack<Iterator> stack = new Stack<Iterator>();
    ComposeIterator(Iterator iterator){
        stack.push(iterator);
    }
    public boolean hasNext() {
        if (stack.empty()){
            return false;
        }
        //先倒出一个迭代器 再判断这个迭代器中的元素多少
        Iterator iterator = stack.peek();
        if (!iterator.hasNext()){
            stack.pop();//倒出一个元素 这也是迭代器为什么只能遍历一次的原因
            return hasNext();
        }else {
            return true;
        }
    }

    /**
     * @description: 这是迭代器的返回方法
     * 1:所有返回元素 均是超类BaseMenuComponent
    　* @author 周杨
    　* @date 2019/5/29  17:22
    **/
    public Object next() {
        if (hasNext()){
            Iterator iterator = stack.peek();
            BaseMenuComponent baseMenuComponent = (BaseMenuComponent)iterator.next();
            stack.push(baseMenuComponent.getIterator());
            return baseMenuComponent;
        }
        return null;
    }

    public void remove() {
        throw new UnsupportedOperationException("remove");
    }
}
